﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Arquitectura.SEM;
using System.Data;
using FAS.SEM.ClasesSEM;

namespace SEM.SEM.ClasesSEM
{
    /*******************************************************
    /* Autor : Efrain Gutierrez / Miguel Ortiz
    /* Fecha : 11/04/2013
    /* Lenguaje: C# Framework 4 .NET
    /* Descripción: Clase encargada de las funciones de los Problemas SEM
    /********************************************************/

    public class ExamenAlumnoSEM : AbstractSem
    {
        /*Atributos Globales*/
        private int idExamenAlumno;
        private String matricula,clave;
        private Double calificacion;
        private List<ProblemaSEM> listaProblemas;
    
        /********************************************************
        /* _construct()
        /* Proposito: inicializar el objeto.
        /* Parametros : ninguno
        /* Limitaciones: ninguna.
        /* Retorna: ninguna
        /*********************************************************/    
        public ExamenAlumnoSEM() : base()
        {
        }
   
        /********************************************************
        /* llenarExamenAlumno(string matricula, string clave)
        /* Proposito: inicializar el objeto con ciertos valores.
        /* Parametros : matricula del alumno y clave de examen
        /* Limitaciones: ninguna.
        /* Retorna: ninguna
        /*********************************************************/    
        public void llenarExamenAlumno(String matricula, String clave)
        {
            this.matricula = matricula;
            this.clave= clave;
            this.calificacion = 0;
            this.idExamenAlumno = this.insertarId();
            DataSet problemas = this.exec("SELECT IdProblema from `examenproblema` where Clave = '"+clave+"'");
            foreach(DataRow row in problemas.Tables[0].Rows)
            {
                exec("CALL `InsertarExamenAlumnoProblemas` ('"+this.idExamenAlumno+"' , '"+row[0].ToString()+"' , 0 , '');");
            }
            this.listaProblemas = new List<ProblemaSEM>();
        }
    
        /********************************************************
        /* getExamenAlumno()
        /* Proposito: regresar atributo idExamenAlumno.
        /* Parametros : ninguno
        /* Limitaciones: debe de ser diferente de null.
        /* Retorna: el valor de idExamenAlumno.
        /*********************************************************/
        public int getIdExamenAlumno()
        {
            return this.idExamenAlumno; 
        }
    
        /********************************************************
        /* getMatricula()
        /* Proposito: regresar atributo matricula.
        /* Parametros : ninguno
        /* Limitaciones: debe de ser diferente de null.
        /* Retorna: el valor de matricula
        /*********************************************************/
        public string getMatricula()
        {
            return this.matricula; 
        }
   
        /********************************************************
        /* getClave()
        /* Proposito: regresar atributo clave.
        /* Parametros : ninguno
        /* Limitaciones: debe de ser diferente de null.
        /* Retorna: el valor de clave
        /*********************************************************/
        public string getClave()
        {
            return this.clave; 
        }
    
        /********************************************************
        /* getCalificacion()
        /* Proposito: regresar atributo calificacion.
        /* Parametros : ninguno
        /* Limitaciones: debe de ser diferente de null.
        /* Retorna: el valor de calificacion
        /*********************************************************/
        public double getCalificacion()
        {
            return this.calificacion; 
        }
    
        /********************************************************
        /* getListaProblemas()
        /* Proposito: regresar atributo listaProblemas.
        /* Parametros : ninguno
        /* Limitaciones: debe de ser diferente de null.
        /* Retorna: el valor de listaProblemas
        /*********************************************************/
        public List<ProblemaSEM> getListaProblemas()
        {
            return this.listaProblemas; 
        }
    
        /********************************************************
        /* setIdExamenAlumno(int IdExamenAlumno)
        /* Proposito: cambiar el valor del atributo idExamenAlumno.
        /* Parametros : idExamenAlumno
        /* Limitaciones: el nuevo valor debe de ser diferente de null.
        /* Retorna: nada
        /*********************************************************/    
        public void setIdExamenAlumno(int idExamenAlumno)
        {
            this.idExamenAlumno= idExamenAlumno; 
        }
    
        /********************************************************
        /* setMatricula(string matricula)
        /* Proposito: cambiar el valor del atributo matricula.
        /* Parametros : matricula
        /* Limitaciones: el nuevo valor debe de ser diferente de null.
        /* Retorna: nada
        /*********************************************************/    
        public void setMatricula(string matricula)
        {
            if(matricula != null)
                this.matricula= matricula; 
        }
    
        /********************************************************
        /* setClave(string Clave)
        /* Proposito: cambiar el valor del atributo Clave.
        /* Parametros : Clave
        /* Limitaciones: el nuevo valor debe de ser diferente de null.
        /* Retorna: nada
        /*********************************************************/    
        public void setClave(string clave)
        {
            if(clave != null)
                this.clave= clave; 
        }
    
        /********************************************************
        /* setCalificacion(double calificacion)
        /* Proposito: cambiar el valor del atributo calificacion.
        /* Parametros : calificacion
        /* Limitaciones: el nuevo valor debe de ser diferente de null.
        /* Retorna: nada
        /*********************************************************/    
        public void setCalificacion(double calificacion)
        {
            this.calificacion= calificacion; 
        }
    
        /********************************************************
        /* setListaProblemas(List listaProblemas)
        /* Proposito: cambiar el valor del atributo listaProblemas.
        /* Parametros : listaProblemas
        /* Limitaciones: el nuevo valor debe de ser diferente de null.
        /* Retorna: nada
        /*********************************************************/    
        public void setlistaProblemas(List<ProblemaSEM> listaProblemas)
        {
            if(listaProblemas != null)
                this.listaProblemas= listaProblemas; 
        }
    
        /********************************************************
        /* comandos()
        /* Proposito: validar la existencia de un Problema en la base de datos.
        /* Parametros : ninguno
        /* Limitaciones: Problema inicializado.
        /* Retorna: Verdadero o Falso
        /*********************************************************/

        protected override void comandos()
        {
            this.id = "IdExamenAlumno";
            this.tabla = "`ExamenAlumno`";
            this.strDelete = "DeleteExamenAlumno";
            this.strInsertar = "InsertarExamenAlumno";
            this.strUpdate = "UpdateExamenAlumno";
        }

        /********************************************************
        /* esBloqueado(string clave)
        /* Proposito: checar estado de bloqueo un examen.
        /* Parametros : ninguno
        /* Limitaciones: debe de ser diferente de null.
        /* Retorna: Verdadero/Falso
        /*********************************************************/
        public Boolean esBloqueado(String clave)
        {
            Dictionary<string, object> diccionario = new Dictionary<string, object>();
            diccionario.Add("ClaveP",clave);
            DataTable valor = this.execProcedure("esBloqueado", diccionario).Tables[0];
            if (valor.Rows.Count > 0)
            {
                DataRow row = valor.Rows[0];
                return (row[0].ToString() == "1");
            }
            else return true;
        }

       /********************************************************
       /* getIdExamenAlumno(string clave, string Matricula)
       /* Proposito: obtener el idExamenAlumno de un examen.
       /* Parametros : matricula de alumno y clave de examen
       /* Limitaciones: Ninguna
       /* Retorna: Id del examen del alumno
       /*********************************************************/
        public Object getIdExamenAlumno(String clave, String matricula)
        {
            Dictionary<string, object> diccionario = new Dictionary<string, object>();
            diccionario.Add("ClaveP", clave);
            diccionario.Add("MatriculaP", matricula);
            DataTable valor = this.execProcedure("getIdExamenAlumno", diccionario).Tables[0];
            if (valor.Rows.Count > 0)
            {
                DataRow row = valor.Rows[0];
                return (row[0].ToString());
            }
            else return false;
        }
    
        /********************************************************
        /* calificar()
        /* Proposito: calificar el examen del alumno.
        /* Parametros : ninguno
        /* Limitaciones: objeto inicializado previamente.
        /* Retorna: ninguno
        /*********************************************************/
        public void calificar()
        {
            int aciertos = 0;
            foreach(ProblemaSEM problema in this.listaProblemas)
            {
                DataTable valor = this.exec("Select Respuesta from ExamenAlumnoProblemas where IdExamenAlumno = '"+this.idExamenAlumno+"' AND IdProblema = '"+problema.getIdProblema()+"'").Tables[0];
                DataRow ro = valor.Rows[0];
                int respuesta = int.Parse(ro[0].ToString());
                List<OpcionSEM> opciones = problema.getListaOpciones();
                int count= 0;
                foreach(OpcionSEM opcion in opciones)
                {
                    if(opcion.esRespuesta())
                        break;
                    count++;
                }
                if(respuesta == count)
                    aciertos++;
            }
            double resultado = aciertos * (100/this.listaProblemas.Count);
            this.setCalificacion(resultado);
            this.update();
        }
    
        /********************************************************
        /* getExamenes(int materia, int grupo,int parcial)
        /* Proposito: recuperar examenes de un grupo de una materia en cierto parcial.
        /* Parametros : materia, grupo, parcial
        /* Limitaciones: ninguno.
        /* Retorna: Lista de Examenes
        /*********************************************************/
        public List<ExamenAlumnoSEM> getExamenes(int materia, int grupo, int parcial)
        {
            Dictionary<string, object> diccionario = new Dictionary<string, object>();
            diccionario.Add("MateriaP",materia);
            diccionario.Add("GrupoP", grupo);
            diccionario.Add("ParcialP",parcial);
            DataSet valor = execProcedure("getExamenes", diccionario);
            List<ExamenAlumnoSEM> examenes = new List<ExamenAlumnoSEM>();
            foreach(DataRow row in valor.Tables[0].Rows)
            {
                ExamenAlumnoSEM e = (ExamenAlumnoSEM)get(row[0].ToString());
                examenes.Add(e);
            }
            return examenes;
        }
    
        /********************************************************
        /* fillSEM(my_sql_row row)
        /* Proposito: inicializar un ExamenALumno con la info de la base de datos.
        /* Parametros : row de consulta
        /* Limitaciones: row completo mysql
        /* Retorna: Ninguna
        /*********************************************************/
        protected override void fillSem(DataRow row)
        {
            this.idExamenAlumno = int.Parse(row[0].ToString());
            this.clave = row[1].ToString();
            this.matricula = row[2].ToString();
            this.calificacion = Double.Parse(row[3].ToString());
            this.listaProblemas= new List<ProblemaSEM>();
            DataSet p = this.exec("SELECT IdProblema from `ExamenAlumnoProblemas` where IdExamenAlumno = '"+this.idExamenAlumno+"'");
            foreach(DataRow r in p.Tables[0].Rows)
            {
                ProblemaSEM obj = new ProblemaSEM();
                obj = (ProblemaSEM)obj.get(r[0].ToString());
                this.listaProblemas.Add(obj);
            }
        }

        /********************************************************
        /* get(int id)
        /* Proposito: inicializar un ExamenALumno a partir de un id desde una base de datos.
        /* Parametros : id del Problema
        /* Limitaciones: Ninguna
        /* Retorna: Problema
        /*********************************************************/
        public override AbstractSem get(object id)
        {
            AbstractSem abs = getAbstractSem(id,this.tabla,this.id);
            return abs;
        }
    
        /********************************************************
        /* getAll
        /* Proposito: inicializar lista de ExamenAlumno existentes desde una base de datos.
        /* Parametros : Ninguna
        /* Limitaciones: Ninguna
        /* Retorna: Lista de Problemaes
        /*********************************************************/

        public List<ExamenAlumnoSEM> getAll()
        {
            List<AbstractSem> abs = base.getAll();
            List<ExamenAlumnoSEM> lst = new List<ExamenAlumnoSEM>();
            foreach (var v in abs)
                lst.Add((ExamenAlumnoSEM)v);
            return lst;
        }
    
        /********************************************************
        /* getAtributos()
        /* Proposito: regresar arreglo de atributos locales
        /* Parametros : Ninguna
        /* Limitaciones: Ninguna
        /* Retorna: Arreglo
        /*********************************************************/

        public override Dictionary<String, Object> getAtributos()
        {
            Dictionary<string, object> diccionario = new Dictionary<string, object>();
            diccionario.Add("ClaveP",clave);
            diccionario.Add("MatriculaP", matricula);
            diccionario.Add("CalificacionP",calificacion);
            diccionario.Add("IdExamenAlumnoP",idExamenAlumno);
            return diccionario;
        }
    } // fin de la clase Problema

}
